# -*- coding: utf-8 -*-
"""
产品模块 - 数据模型定义

本文件定义了测试DEMO中金融产品相关的所有数据模型，包括：

1. ProductCategory - 产品分类模型
   - 管理金融产品的分类体系
   - 包含分类名称、代码和描述
   - 为产品提供分类管理功能

2. Product - 金融产品模型
   - 存储金融产品的完整信息
   - 包含产品代码、名称、分类和类型
   - 记录基金经理、公司、成立日期等基本信息
   - 管理各种费用（管理费、托管费、申购费、赎回费）
   - 设置投资限制（最小/最大投资金额）
   - 定义流动性参数（赎回到账天数）
   - 支持产品状态管理（正常、暂停、关闭）

3. ProductPrice - 产品价格历史模型
   - 记录产品的历史价格数据
   - 包含单位净值、累计净值和日收益率
   - 按日期排序，支持时间序列分析
   - 确保产品和日期的唯一性约束

4. ProductPerformance - 产品业绩表现模型
   - 存储产品在不同时间周期的业绩指标
   - 支持多个统计周期（1M, 3M, 6M, 1Y, 3Y, 5Y）
   - 包含收益率、波动率、夏普比率、最大回撤等关键指标
   - 为产品评估和比较提供数据支持

常量定义：
- PRODUCT_TYPES: 产品类型选项（稳健型、平衡型、成长型、进取型）
- PRODUCT_STATUS: 产品状态选项（正常、暂停、关闭）

产品类型说明：
- 稳健型: 低风险低收益，适合保守投资者
- 平衡型: 中等风险收益，平衡投资策略
- 成长型: 较高风险收益，追求资本增值
- 进取型: 高风险高收益，适合激进投资者

这些模型构成了完整的金融产品管理体系，支持产品的
分类管理、价格跟踪、业绩分析和投资决策。

Author: zhaozeliang
Date: 2025-09-06
"""

from django.db import models
from decimal import Decimal

# 产品类型选择
PRODUCT_TYPES = [
    ('stable', '稳健型'),
    ('balanced', '平衡型'),
    ('growth', '成长型'),
    ('aggressive', '进取型'),
]

# 产品状态
PRODUCT_STATUS = [
    ('active', '正常'),
    ('suspended', '暂停'),
    ('closed', '关闭'),
]

class ProductCategory(models.Model):
    """产品分类"""
    name = models.CharField(max_length=50, verbose_name='分类名称')
    code = models.CharField(max_length=20, unique=True, verbose_name='分类代码')
    description = models.TextField(blank=True, verbose_name='描述')
    
    class Meta:
        verbose_name = '产品分类'
        verbose_name_plural = '产品分类'
        db_table = 'product_categories'
    
    def __str__(self):
        return self.name

class Product(models.Model):
    """金融产品模型"""
    code = models.CharField(max_length=20, unique=True, verbose_name='产品代码')
    name = models.CharField(max_length=100, verbose_name='产品名称')
    category = models.ForeignKey(ProductCategory, on_delete=models.CASCADE, verbose_name='产品分类')
    product_type = models.CharField(max_length=20, choices=PRODUCT_TYPES, verbose_name='产品类型')
    risk_level = models.IntegerField(default=1, verbose_name='风险等级')
    
    # 基本信息
    manager = models.CharField(max_length=100, verbose_name='基金经理')
    company = models.CharField(max_length=100, verbose_name='基金公司')
    establishment_date = models.DateField(verbose_name='成立日期')
    
    # 费用信息
    management_fee = models.DecimalField(max_digits=5, decimal_places=4, verbose_name='管理费率')
    custody_fee = models.DecimalField(max_digits=5, decimal_places=4, verbose_name='托管费率')
    subscription_fee = models.DecimalField(max_digits=5, decimal_places=4, verbose_name='申购费率')
    redemption_fee = models.DecimalField(max_digits=5, decimal_places=4, verbose_name='赎回费率')
    
    # 投资限制
    min_investment = models.DecimalField(max_digits=15, decimal_places=2, default=Decimal('1000'), verbose_name='最小投资金额')
    max_investment = models.DecimalField(max_digits=15, decimal_places=2, null=True, blank=True, verbose_name='最大投资金额')
    
    # 流动性
    liquidity_days = models.IntegerField(default=1, verbose_name='赎回到账天数')
    
    # 状态
    status = models.CharField(max_length=20, choices=PRODUCT_STATUS, default='active', verbose_name='状态')
    
    # 时间戳
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
    
    class Meta:
        verbose_name = '金融产品'
        verbose_name_plural = '金融产品'
        db_table = 'products'
        ordering = ['-created_at']
    
    def __str__(self):
        return f'{self.code} - {self.name}'

class ProductPrice(models.Model):
    """产品价格历史"""
    product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name='产品')
    price_date = models.DateField(verbose_name='价格日期')
    net_value = models.DecimalField(max_digits=10, decimal_places=4, verbose_name='单位净值')
    accumulated_value = models.DecimalField(max_digits=10, decimal_places=4, verbose_name='累计净值')
    daily_return = models.DecimalField(max_digits=8, decimal_places=4, null=True, blank=True, verbose_name='日收益率')
    
    class Meta:
        verbose_name = '产品价格'
        verbose_name_plural = '产品价格'
        db_table = 'product_prices'
        unique_together = ['product', 'price_date']
        ordering = ['-price_date']
    
    def __str__(self):
        return f'{self.product.code} - {self.price_date}'

class ProductPerformance(models.Model):
    """产品业绩表现"""
    product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name='产品')
    period = models.CharField(max_length=20, verbose_name='统计周期')  # 1M, 3M, 6M, 1Y, 3Y, 5Y
    return_rate = models.DecimalField(max_digits=8, decimal_places=4, verbose_name='收益率')
    volatility = models.DecimalField(max_digits=8, decimal_places=4, verbose_name='波动率')
    sharpe_ratio = models.DecimalField(max_digits=8, decimal_places=4, null=True, blank=True, verbose_name='夏普比率')
    max_drawdown = models.DecimalField(max_digits=8, decimal_places=4, null=True, blank=True, verbose_name='最大回撤')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
    
    class Meta:
        verbose_name = '产品业绩'
        verbose_name_plural = '产品业绩'
        db_table = 'product_performances'
        unique_together = ['product', 'period']
    
    def __str__(self):
        return f'{self.product.code} - {self.period}'
